package com.afiorenza.collections.Lists;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;

import org.junit.Test;

import com.afiorenza.Hijo;
import com.afiorenza.defaultTest;
import com.google.common.base.Stopwatch;

public class ListTests extends defaultTest {

	@Test
	public void runTest() {

		List<Hijo> hijosLinkedList = new LinkedList<Hijo>();
		List<Hijo> hijosArrayList = new ArrayList<Hijo>();
		cargarList(hijosArrayList);
		cargarList(hijosLinkedList);

		timer = Stopwatch.createStarted();
		recorrerHijos(hijosArrayList);
		System.out.println(timer.stop());

		timer = Stopwatch.createStarted();
		recorrerHijos(hijosLinkedList);
		System.out.println(timer.stop());

		hijosLinkedList.removeAll(hijosArrayList);
		recorrerHijos(hijosLinkedList);

		timer = Stopwatch.createStarted();
		this.buscarUno(hijosArrayList);
		System.out.println("Cantins in arrayList: " + timer.stop());

		timer = Stopwatch.createStarted();
		this.buscarUno(hijosLinkedList);
		System.out.println("Cantins in LinkedList: " + timer.stop());

		hijosArrayList.sort(new Hijo());

		this.recorrerHijos(hijosArrayList);

	}

	private void cargarList(List<Hijo> list) {
		for (int i = 0; i < this.i; i++) {
			list.add(new Hijo("Nombre" + i, i, "Escuela" + i));
		}
	}

	private <E extends Hijo> void recorrerHijos(List<E> list) {
		if (list.isEmpty())
			return;

		ListIterator<E> listIterator = list.listIterator();

		System.out.println(listIterator.next().getNombre());
		System.out.println(listIterator.next().getNombre());
		System.out.println(listIterator.next().getNombre());
		System.out.println(listIterator.previous().getNombre());
		System.out.println(listIterator.next().getNombre());
		System.out.println(listIterator.next().getNombre());

	}

	private <E extends Hijo> void buscarUno(List<E> list) {

		Iterator<E> iterator = list.iterator();
		while (iterator.hasNext()) {
			list.contains(iterator.next());
		}

	}
}
